﻿using DAO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Entidad;
using System.Data.SqlClient;
namespace DAO
{
   public class PersonaDAO  : ABMCUsuarioInterface
    {
      private DAO_v2 dao;
     
        public PersonaDAO()
        {
            dao = new DAO_v2();
            
        }
        public string CadenaConexion()
        {
            return dao.StringConexion();
        }

        public  int  registrarPersona(PersonaEnt persona)
        {
            Int32 id=0;
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
              
                cn.Open();

                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
              
                parametros.Add("documento");
                datos.Add(persona.documento);
                 parametros.Add("nombre");
                datos.Add(persona.Nombre);
                parametros.Add("apellido");
                datos.Add(persona.Apellido);         

                parametros.Add("telefono");
                if (persona.Telefono.HasValue)
                {
                    datos.Add(persona.Telefono);
                }
                else
                {
                    datos.Add(DBNull.Value);
                }
                parametros.Add("domicilio");
                if (persona.Domicilio != null)
                {
                    datos.Add(persona.Domicilio);
                }
                else
                {
                    datos.Add(DBNull.Value);
                }

                parametros.Add("id_TipoDocumento");
                datos.Add(persona.id_TipoDocumento);
                parametros.Add("fechaNacimiento");
                datos.Add(persona.FechaNacimiento);
                //datos.Add(persona.FechaNacimiento.ToShortDateString());
           

                SqlCommand cmd = dao.Grabar("Persona",parametros,datos);
                cmd.Connection =cn;
             //   cmd.ExecuteNonQuery();
                id=Convert.ToInt32(cmd.ExecuteScalar());
               return (int)id;

            }
            catch (SqlException ex)
            {
                throw new ApplicationException("Problema al grabar los datos");
            }
            finally
            {
                dao.CerrarConexion(cn);
            }
     
        }



        public void actualizarPersona(PersonaEnt persona)
        {
            SqlConnection cn = new SqlConnection(CadenaConexion());
            //Int32 id = 0;
            try
            {
                cn.Open();
                List<String> parametrosSet = new List<String>();
                List<Object> datosSet = new List<Object>();
                List<String> parametrosWhere = new List<String>();
                List<Object> datosWhere = new List<Object>();
                parametrosSet.Add("documento");
                datosSet.Add(persona.documento);
                parametrosSet.Add("apellido");
                datosSet.Add(persona.Apellido);
                parametrosSet.Add("nombre");
                datosSet.Add(persona.Nombre);

                parametrosSet.Add("telefono");
                if (persona.Telefono.HasValue)
                {
                    datosSet.Add(persona.Telefono);
                }
                else
                {
                    datosSet.Add(DBNull.Value);
                }
                parametrosSet.Add("domicilio");
                if (persona.Domicilio != null)
                {
                    datosSet.Add(persona.Domicilio);
                }
                else
                {
                    datosSet.Add(null);
                }
                parametrosSet.Add("id_TipoDocumento");
                datosSet.Add(persona.id_TipoDocumento);
                parametrosSet.Add("fechaNacimiento");
                datosSet.Add(persona.FechaNacimiento);
                parametrosWhere.Add("id_Persona");
                datosWhere.Add(persona.ID_Persona);
                SqlCommand cmd = dao.Actualizar("Persona", parametrosSet, datosSet, parametrosWhere, datosWhere);
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();
                //id = Convert.ToInt32(cmd.ExecuteScalar());
                //return (int)id;

             
            }
            catch (SqlException ex)
            {
                throw new ApplicationException("Error al actualizar la persona...");
            }
            finally
            {
                dao.CerrarConexion(cn);
            }

        }


        public void borrarPersona(int id_persona)
        {
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
                cn.Open();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                parametros.Add("id_persona");
                datos.Add(id_persona);
                SqlCommand cmd = dao.Eliminar("Persona", parametros, datos);
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new ApplicationException("Error al eliminar la Persona...");
            }
            finally
            {
                dao.CerrarConexion(cn);
            }

        }

        public PersonaEnt BuscarPersona(int id_persona)
        {
            PersonaEnt resultado = new PersonaEnt();


            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {

                cn.Open();
                List<String> columnas = new List<String>();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                columnas.Add("id_Persona");
                columnas.Add("documento");
                columnas.Add("apellido");
                columnas.Add("nombre");
                columnas.Add("telefono");
                columnas.Add("domicilio");
                columnas.Add("id_TipoDocumento");
                columnas.Add("fechaNacimiento");

                parametros.Add("id_Persona");
                datos.Add(id_persona);
                SqlCommand cmd = dao.Buscar("Persona", columnas, parametros, datos);
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    resultado.ID_Persona = int.Parse(dr["id_Persona"].ToString());
                    resultado.documento = int.Parse(dr["documento"].ToString());
                    resultado.Apellido = dr["apellido"].ToString();
                    resultado.Nombre = dr["nombre"].ToString();                    

                    if (dr["telefono"].ToString() != DBNull.Value.ToString())
                    {
                        resultado.Telefono = long.Parse(dr["telefono"].ToString());
                    }
                    else
                    {
                        resultado.Telefono = null;
                    }


                    if (dr["domicilio"].ToString() != DBNull.Value.ToString())
                    {
                        resultado.Domicilio = dr["domicilio"].ToString();
                    }
                    else
                    {
                        resultado.Domicilio = null;
                    }

                    resultado.id_TipoDocumento = int.Parse(dr["id_TipoDocumento"].ToString());
                    resultado.FechaNacimiento= DateTime.Parse(dr["fechaNacimiento"].ToString());
                }
                return resultado;
            }
            catch (SqlException ex)
            {
                return null;
                throw new ApplicationException("Error al buscar la persona...");
            }
            finally
            {
                if (cn.State == System.Data.ConnectionState.Open)
                {
                    cn.Close();
                }
            }
            
        }


        public Boolean BuscarPersonaDocumento(int documento, int tipoDoc)
        {
            PersonaEnt resultado = new PersonaEnt();


            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {

                cn.Open();
                List<String> columnas = new List<String>();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                columnas.Add("id_Persona");
                columnas.Add("documento");
                columnas.Add("apellido");
                columnas.Add("nombre");
                columnas.Add("telefono");
                columnas.Add("domicilio");
                columnas.Add("id_TipoDocumento");
                columnas.Add("fechaNacimiento");

                parametros.Add("documento");
                datos.Add(documento);
                parametros.Add("id_TipoDocumento");
                datos.Add(tipoDoc);
                SqlCommand cmd = dao.Buscar("Persona", columnas, parametros, datos);
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                
                if (dr.Read())
                {
                    resultado.ID_Persona = int.Parse(dr["id_Persona"].ToString());
                    resultado.documento = int.Parse(dr["documento"].ToString());
                    resultado.Apellido = dr["apellido"].ToString();
                    resultado.Nombre = dr["nombre"].ToString();

                    if (dr["telefono"].ToString() != DBNull.Value.ToString())
                    {
                        resultado.Telefono = long.Parse(dr["telefono"].ToString());
                    }
                    else
                    {
                        resultado.Telefono = null;
                    }


                    if (dr["domicilio"].ToString() != DBNull.Value.ToString())
                    {
                        resultado.Domicilio = dr["domicilio"].ToString();
                    }
                    else
                    {
                        resultado.Domicilio = null;
                    }

                    resultado.id_TipoDocumento = int.Parse(dr["id_TipoDocumento"].ToString());
                    resultado.FechaNacimiento = DateTime.Parse(dr["fechaNacimiento"].ToString());
                    return true;
                }
                return false;
            }
            catch (SqlException ex)
            {
                return false;
                throw new ApplicationException("Error al buscar la persona...");
            }
            finally
            {
                if (cn.State == System.Data.ConnectionState.Open)
                {
                    cn.Close();
                }
            }

        }

        //Obtengo tipos de Documento para cargar el combo
        public  List<Entidad.TipoDNIEnt> obtenerTipoDoc()
        {
            SqlConnection cn = new SqlConnection();
            cn.ConnectionString = CadenaConexion();

            List<Entidad.TipoDNIEnt> listTipoDoc = new List<Entidad.TipoDNIEnt>();
          
           
            try 
	     {	        
		    cn.Open();          
             List<String> columnas = new List<String>();
             
             columnas.Add("id_TipoDocumento");
             columnas.Add("nombre");
             SqlCommand cmd = new SqlCommand();
             cmd = (dao.CargarCombo("TipoDocumento", columnas, "order by descripcion"));
             cmd.Connection = cn;
              SqlDataReader dr = cmd.ExecuteReader();
     
            
             while (dr.Read())
             {
                 TipoDNIEnt tpDoc = new TipoDNIEnt();
                 tpDoc.id_tipoDocumento = int.Parse(dr["id_TipoDocumento"].ToString());
                 tpDoc.Descripcion = (dr["nombre"].ToString());
                 listTipoDoc.Add(tpDoc);
                
             }
	     }
	    catch (SqlException ex)
	    {
		
	    	throw new ApplicationException ("Problema al obtener los tipos de  documentos");
	    }
            finally
            {
                dao.CerrarConexion(cn);
            }
            return listTipoDoc;

         }

        //NO IMPLEMENTADAS
        //usuario

        public List<UsuarioEnt> ObtenerUsuariosQueryParaAdmin()
        {
            throw new NotImplementedException();
        }
        public List<UsuarioEnt> ObtenerUsuariosQueryParaOtros()
        {
            throw new NotImplementedException();
        }
        public void registrarUsuario(UsuarioEnt usuario, int id_persona)
        {

            throw new NotImplementedException();
        }
        public void actualizarUsuario(UsuarioEnt usuario, int id_persona)
        {
            throw new NotImplementedException();
        }

        public void borrarUsuario(int legajo)
        {

            throw new NotImplementedException();
        }
        public UsuarioEnt buscarUsuario(int legajo)
        {
            throw new NotImplementedException();
        }
        public List<UsuarioEnt> buscarUsuarioFiltro(string filtro)         
        {
            throw new NotImplementedException();
        }
          }
      }




